package algorithm_primary.studyClass.新手课程.实现队列;

/**
 * @author 衡孟浩
 * @date 2023/5/28 14:48
 * <p>
 * 实现队列结构   先进先出
 * 这个队列中有三个方法     一个是 poll 弹出      peek 返回第一次添加的数值
 */
public class MyQueue<V> {

    private MyNode<V> head;
    private MyNode<V> tail;

    private Integer size;

    public MyQueue() {
        head = null;
        tail = null;
        size = 0;
    }

    /**
     * 判断是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 给队列添加属性
     * 如果成功返回true
     *
     * @return
     */
    public boolean offer(V value) {
        MyNode<V> newNode = new MyNode<>(value);
        if (tail == null) {
            // 认为当前队列一个节点都没有  因为当前队列如果有节点   那么肯定会给head  tail赋值的
            // 如果没用节点  那么就让  head 和tail  都等于 当前这个新的节点
            tail = newNode;
            head = newNode;
        } else {
            // 让之前最后的下一个指针指向当前这个新节点
            tail.next = newNode;
            // 说明当前是有节点的  那么就让tail等于当前最新节点
            tail = newNode;
        }
        size++;
        return true;
    }


    /**
     * 弹出节点   先进先出  弹出的是值
     *
     * @param newNode
     * @return
     */
    public V poll() {
        V resultValue = null;
        if (head != null) {
            // 说明有值
            resultValue = head.value;
            head = head.next;
            size--;
            if (head == null) {
                tail = null;
            }
        }
        return resultValue;
    }

    /**
     * 只是看当前头节点值不会弹出
     *
     * @return
     */
    public V peck() {
        V resultValue = null;
        if (head != null) {
            resultValue = head.value;
        }
        return resultValue;
    }

    public int size() {
        return size;
    }
}
